extends Node
class_name ArmyData
# ======================================================
# 军队数据管理系统
# 负责管理军队组成、资源及数据持久化
# ======================================================


#region 核心数据
# ------------------------------------------------------
var troops: Array[TroopUnit] = [] # 当前所有兵种单位（TroopUnit数组）
var gold: int = 100 # 军队资金（>=0）
var max_count = 10 # 最大兵力容量（总单位数上限）
var technologies: Array[TechnologyResource] = []
var equipments: Array[EquipmentResource] = []
#endregion

#region 数据查询
# ------------------------------------------------------
# 获取当前总兵力
# @return: 所有单位数量之和
func get_total_troops() -> int:
	var total = 0
	for unit in troops:
		total += unit.count
	return total

# 按类型查找单位
# @param type: 要查找的兵种类型
# @return: 找到的TroopUnit实例，未找到返回null
func get_troops_by_type(type: int) -> TroopUnit:
	for unit in troops:
		if unit.type == type:
			return unit
	return null
#endregion

#region 持久化
# ------------------------------------------------------
# 序列化全部数据
# @return: 包含所有数据的字典
func to_dict() -> Dictionary:
	var troops_data = []
	for unit in troops:
		troops_data.append(unit.to_dict())

	# 科技数据简化为ID数组
	var tech_ids = []
	for tech in technologies:
		tech_ids.append(tech.tech_id) # 假设TechnologyResource有tech_id属性

	# 装备数据简化为ID数组
	var equip_ids = []
	for equip in equipments:
		equip_ids.append(equip.equip_id) # 假设EquipmentResource有equip_id属性

	return {
		"gold": gold,
		"max_count": max_count,
		"troops": troops_data,
		"technology_ids": tech_ids, # 改为存储ID数组
		"equipment_ids": equip_ids # 改为存储ID数组
	}

# 从字典加载数据
# @param data: 包含持久化数据的字典
func from_dict(data: Dictionary):
	gold = data.get("gold", 0)
	max_count = data.get("max_count", 10)
	
	# 加载部队数据
	troops.clear()
	for unit_data in data.get("troops", []):
		var unit = TroopUnit.from_dict(unit_data)
		if unit:
			troops.append(unit)

	# 加载科技数据（通过ID查找实例）
	technologies.clear()
	var tech_mgr = TechnologyManager # 假设存在科技管理器
	for tech_id in data.get("technology_ids", []):
		var tech = tech_mgr.get_tech_by_id(tech_id)
		if tech:
			add_technology(tech)

	# 加载装备数据（通过ID查找实例）
	equipments.clear()
	var equip_mgr = EquipmentManager # 假设存在装备管理器
	for equip_id in data.get("equipment_ids", []):
		var equip = equip_mgr.get_equip_by_id(equip_id)
		if equip:
			equipments.append(equip)
#endregion


#region 通用方法
# ------------------------------------------------------
# 重置为初始状态
func reset():
	troops.clear()
	technologies.clear()
	equipments.clear()
	gold = 100
	max_count = 10

# 优化后的添加/合并兵种方法（新增容量检查）
# @param type: 要添加的兵种类型
# @param num: 要添加的数量（实际添加量受容量限制）
func add_troop(type: int, num: int, s_p: String = "", i_p: String = ""):
	# 计算当前总兵力
	var current_total = get_total_troops()

	# 计算可添加数量
	var available_space = max(0, max_count - current_total)
	var actual_add = min(num, available_space)

	# 无可用空间时直接返回
	if actual_add <= 0:
		return

	# 查找现有同类单位
	for unit in troops:
		if unit.type == type:
			# 合并单位
			unit.count += actual_add
			return

	# 新增单位类型时检查容量
	if current_total + actual_add > max_count:
		actual_add = max_count - current_total

	# 创建新单位
	troops.append(TroopUnit.new(type, actual_add, s_p, i_p))

# 移除指定类型单位
# @param type: 要移除的兵种类型
# @param num: 要移除的数量
func remove_troop(type: int, num: int):
	for i in range(troops.size() - 1, -1, -1):
		if troops[i].type == type:
			troops[i].count = max(0, troops[i].count - num)
			if troops[i].count <= 0:
				troops.remove_at(i)
			return

# 添加科技（带去重检查）
func add_technology(tech: TechnologyResource):
	# 检查是否已存在相同ID的科技
	if not has_technology(tech.tech_id):
		technologies.append(tech)
		tech.activate() # 激活科技效果
	else:
		push_warning("重复添加科技: %s" % tech.tech_id)

# 移除指定科技
func remove_technology(tech_id: String):
	for i in range(technologies.size() - 1, -1, -1):
		if technologies[i].tech_id == tech_id:
			technologies[i].deactivate() # 停用科技效果
			technologies.remove_at(i)

# 检查是否拥有指定科技
func has_technology(tech_id: String) -> bool:
	return technologies.any(func(t): return t.tech_id == tech_id)

# 清空所有科技
func clear_technologies():
	for tech in technologies:
		tech.deactivate()
	technologies.clear()

# 添加装备（带去重检查）
func add_equipment(equip: EquipmentResource):
	# 检查是否已存在相同ID的装备
	if not has_equipment(equip.equip_id):
		equipments.append(equip)
		equip.activate() # 激活装备效果
	else:
		push_warning("重复添加装备: %s" % equip.equip_id)

# 移除指定装备
func remove_equipment(equip_id: String):
	for i in range(equipments.size() - 1, -1, -1):
		if equipments[i].equip_id == equip_id:
			equipments[i].deactivate() # 停用装备效果
			equipments.remove_at(i)

# 检查是否拥有指定装备
func has_equipment(equip_id: String) -> bool:
	return equipments.any(func(e): return e.equip_id == equip_id)

# 清空所有装备
func clear_equipments():
	for equip in equipments:
		equip.deactivate()
	equipments.clear()
#endregion
